//
// Created by 32827 on 2023/11/25.
//

#ifndef YZFRAME_YZF_DMA_H
#define YZFRAME_YZF_DMA_H
#include "yzf.h"
enum YZF_DMA_PRIOR{
    YZF_DMA_LOW=0b00,
    YZF_DMA_MIDDLE=0b01,
    YZF_DMA_HIGH=0b10,
    YZF_DMA_MOST=0b11
};
enum YZF_DMA_SIZE{
    YZF_DMA_BYTE=0b00,
    YZF_DMA_HALF_WORD=0b01,
    YZF_DMA_WORD=0b10,
};
typedef enum YZF_DMA_PRIOR YZF_DMA_PRIORITY;
typedef enum YZF_DMA_SIZE YZF_DMA_SIZE;

YZF_RESULT yzf_dma_clock_enable(YZF_DMA_POINTER dma);
YZF_RESULT yzf_dma_clock_disable(YZF_DMA_POINTER dma);
//传输错误标志
YZF_BOOL yzf_dma_flag_TE(YZF_DMA_POINTER dma,uint8_t channel);
//半传输标志
YZF_BOOL yzf_dma_flag_HT(YZF_DMA_POINTER dma,uint8_t channel);
//传输完成标志
YZF_BOOL yzf_dma_flag_TC(YZF_DMA_POINTER dma,uint8_t channel);
//全局中断标志
YZF_BOOL yzf_dma_flag_G(YZF_DMA_POINTER dma,uint8_t channel);
//传输错误标志清除
YZF_RESULT yzf_dma_clear_flag_TEIF(YZF_DMA_POINTER dma,uint8_t channel);
//半传输标志清除
YZF_RESULT yzf_dma_clear_flag_HTIF(YZF_DMA_POINTER dma,uint8_t channel);
//传输完成标志清除
YZF_RESULT yzf_dma_clear_flag_TCIF(YZF_DMA_POINTER dma,uint8_t channel);
//全局中断标志清除
YZF_RESULT yzf_dma_clear_flag_GIF(YZF_DMA_POINTER dma,uint8_t channel);
YZF_RESULT yzf_dma_clear_all_flag(YZF_DMA_POINTER dma,uint8_t channel);

//存储器到存储器
YZF_RESULT yzf_dma_mode_mem_mem(YZF_DMA_CHANNEL_POINTER channel);
//非存储器到存储器
YZF_RESULT yzf_dma_mode_per_mem(YZF_DMA_CHANNEL_POINTER channel);
//存储器到外设
YZF_RESULT yzf_dma_mode_mem_per(YZF_DMA_CHANNEL_POINTER channel);

//设置通道优先级
YZF_RESULT yzf_dma_set_priority(YZF_DMA_CHANNEL_POINTER channel,YZF_DMA_PRIORITY priority);

//存储器数据宽度
YZF_RESULT yzf_dma_mem_size(YZF_DMA_CHANNEL_POINTER channel,YZF_DMA_SIZE size);
//设备数据宽度
YZF_RESULT yzf_dma_per_size(YZF_DMA_CHANNEL_POINTER channel,YZF_DMA_SIZE size);

//内存是否递增
YZF_RESULT yzf_dma_mode_mem_inc(YZF_DMA_CHANNEL_POINTER channel,YZF_BOOL enable);
//设备是否递增
YZF_RESULT yzf_dma_mode_per_inc(YZF_DMA_CHANNEL_POINTER channel,YZF_BOOL enable);

//循环接收
YZF_RESULT yzf_dma_mode_circular(YZF_DMA_CHANNEL_POINTER channel,YZF_BOOL enable);

//从外设读
YZF_RESULT yzf_dma_mode_per_read(YZF_DMA_CHANNEL_POINTER channel);
//从内存读
YZF_RESULT yzf_dma_mode_mem_read(YZF_DMA_CHANNEL_POINTER channel);

//传输错误中断
YZF_RESULT yzf_dma_interrupt_TE(YZF_DMA_CHANNEL_POINTER channel,YZF_BOOL enable);
//传输完成中断
YZF_RESULT yzf_dma_interrupt_TC(YZF_DMA_CHANNEL_POINTER channel,YZF_BOOL enable);
//半传输中断
YZF_RESULT yzf_dma_interrupt_HT(YZF_DMA_CHANNEL_POINTER channel,YZF_BOOL enable);

//dma开启/关闭
YZF_RESULT yzf_dma_enable(YZF_DMA_CHANNEL_POINTER channel);
YZF_RESULT yzf_dma_disable(YZF_DMA_CHANNEL_POINTER channel);
YZF_BOOL yzf_dma_isDisable(YZF_DMA_CHANNEL_POINTER channel);

//通道选择
YZF_RESULT yzf_dma_channel_select(YZF_DMA_CHANNEL_POINTER dma,uint16_t channel_num);

//传输数量
YZF_RESULT yzf_dma_transmit_count(YZF_DMA_CHANNEL_POINTER channel,uint16_t count);
//设备地址
YZF_RESULT yzf_dma_per_address(YZF_DMA_CHANNEL_POINTER channel,uint32_t address);
//内存地址
YZF_RESULT yzf_dma_mem0_address(YZF_DMA_CHANNEL_POINTER channel,uint32_t address);
YZF_RESULT yzf_dma_mem1_address(YZF_DMA_CHANNEL_POINTER channel,uint32_t address);

#endif //YZFRAME_YZF_DMA_H
